/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#ifndef __2289980F_782F_4a10_A19F_8A161D1A159E__
#define __2289980F_782F_4a10_A19F_8A161D1A159E__

namespace xos_container
{
    class i_container;
}

namespace xos_box
{
    class i_callback;
    class i_box_mgr;
}

namespace xos_log
{

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    class i_log_msg;

    using f_log_fmt_args = void ( * )( xos_container::i_container * pContainer, xos_log::i_log_msg * pMsg, xos_box::i_string * pStr );
    using f_log_destroy = void ( * )( char * lpszArgs );

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    //
    // 日志信息接口
    // 所有返回的字串长度,都有不包括最后的0
    // 
    class i_log_msg : public xos::i_release
    {
    protected:
        virtual ~i_log_msg(){}

    public:
        // 
        // 得到合成后的日志全内容
        // 
        virtual const char * get_log_content( char * lpszLogContent, int nCharNum, int * lpnRetCharNum ) = 0;

        // 
        // 得到日志时间
        // 
        virtual int get_log_time( int * lpnYear,
            int * lpnMonth,
            int * lpnDay,
            int * lpnHour,
            int * lpnMinute,
            int * lpnSeconde,
            int * lpnMilliSecond ) = 0;

        // 
        // 异步日志参数
        // 
        virtual int set_log_info( const char * lpszName, int ulLevel, const char * lpszCodeFile, int ulCodeLine, const char * lpszFmt ) = 0;
        virtual int set_fmt_log_fun( f_log_fmt_args & fun ) = 0;
        virtual int set_destroy_fun( f_log_destroy & fun ) = 0;
        virtual int set_fmt( const char * fmt ) = 0;
        virtual const char * get_fmt() = 0;
        virtual xos_box::i_list * str_args_list() = 0;
        virtual char * args_buf() = 0;
    };

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // 
    // 扩展日志输出方式
    // 
    class i_logger : public xos::i_release
    {
    protected:
        virtual ~i_logger(){}

    public:
        // 输出日志
        virtual int out_put_log( i_log_msg * pLogMsg ) = 0;
        virtual int flush() = 0;
    };

    // 
    // 扩展日志输出方式
    // 
    class i_log_net : public i_logger
    {
    protected:
        virtual ~i_log_net(){}

    public:
        virtual int set_log_server_info( const char * lpszIp, int ulPort ) = 0;
    };

    // 
    // 扩展日志输出方式
    // 
    class i_log_file : public i_logger
    {
    protected:
        virtual ~i_log_file(){}

    public:
        virtual int set_log_file_path( const char * lpszLogPath ) = 0;
        virtual int set_log_file_name( const char * lpszFile ) = 0;
        // default is 100 * xos_box::i_buf::BUF_SIZE
        virtual int set_buf_num_to_flush( int nBufNum ) = 0;
    };

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // 
    // 日志输出接口
    // 
    class i_log_mgr : public xos::i_release
    {
    protected:
        virtual ~i_log_mgr(){}

    public:
        // 
        // 设置公共线程，所有日志消息都扔到这个线程中处理。公用线程能节省，少用一些线程，代码也清楚一些
        // 
        virtual int set_work_thread( xos_box::i_callback * pWorkThread ) = 0;

        // 
        // 添加日志输出方式
        // 
        virtual int add_logger( i_logger* pLogger ) = 0;
        virtual i_log_file* file() = 0;
        virtual i_logger* debug() = 0;
        virtual i_logger* cmd() = 0;

        // i_log_msg相关
        virtual int notify( i_log_msg *& pMsg ) = 0;
        virtual i_log_msg * msg() = 0;

        // 
        // 日志
        // 
        virtual int enable( bool bEnable ) = 0;
        virtual int flush() = 0;
    };

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // 导出函数定义
    // 
    typedef int ( * f_create )( xos_container::i_container * pContainer, i_log_mgr ** ppv );

} // xos_log

#endif // __2289980F_782F_4a10_A19F_8A161D1A159E__
